home *** CD-ROM | disk | FTP | other *** search
- var googleredesignedDomi = {
- addSelectorMenuItem:function (popup, selector) {
- var menuitem = document.createElementNS(googleredesignedCommon.XULNS, "menuitem");
- menuitem.setAttribute("label", selector);
- menuitem.setAttribute("oncommand", "googleredesignedDomi.copySelectorToClipboard(event)");
- popup.appendChild(menuitem);
- },
- copySelectorToClipboard:function (event) {
- Components.classes['@mozilla.org/widget/clipboardhelper;1'].getService(Components.interfaces.nsIClipboardHelper).copyString(event.target.getAttribute("label"));
- },
- generateSelectors:function (event) {
- var node = viewer.selectedNode;
- if (!(node instanceof Element)) {
- return;
- }
- var popup = event.target;
- googleredesignedDomi.addSelectorMenuItem(popup, node.nodeName);
- if (node.hasAttribute("id")) {
- googleredesignedDomi.addSelectorMenuItem(popup, "#" + node.getAttribute("id"));
- }
- if (node.hasAttribute("class")) {
- var classes = node.getAttribute("class").split(/\s+/);
- googleredesignedDomi.addSelectorMenuItem(popup, "." + classes.join("."));
- }
- if (node.attributes.length > 1 ||
- (node.attributes.length == 1 &&
- node.attributes[0].name != "id" &&
- node.attributes[0].name != "class")) {
- var selector = node.nodeName;
- for (var i = 0; i < node.attributes.length; i++) {
- if (node.attributes[i].name != "id") {
- selector += "[" + node.attributes[i].name + "=\"" + node.attributes[i].value + "\"]";
- }
- }
- googleredesignedDomi.addSelectorMenuItem(popup, selector);
- }
- if (!node.hasAttribute("id")) {
- googleredesignedDomi.addSelectorMenuItem(popup, googleredesignedDomi.getPositionalSelector(node));
- }
- },
- getParentPositionalSelector:function (node) {
- if (node.parentNode instanceof Document) {
- return "";
- }
- return googleredesignedDomi.getPositionalSelector(node.parentNode) + " > ";
- },
- getPositionalSelector:function (node) {
- if (node instanceof Document) {
- return "";
- }
- if (node.hasAttribute("id")) {
- return "#" + node.getAttribute("id");
- }
- var uniqueChild = true;
- var nodeName = node.nodeName;
- for (var i = 0; i < node.parentNode.childNodes.length; i++) {
- var currentNode = node.parentNode.childNodes[i];
- if (!(currentNode instanceof Element)) {
- continue;
- }
- if (node != currentNode && node.nodeName == currentNode.nodeName) {
- uniqueChild = false;
- break;
- }
- }
- if (uniqueChild) {
- return googleredesignedDomi.getParentPositionalSelector(node) + node.nodeName;
- }
- if (googleredesignedDomi.isCSSFirstChild(node)) {
- return googleredesignedDomi.getParentPositionalSelector(node) + node.nodeName + ":first-child";
- }
- if (googleredesignedDomi.isCSSLastChild(node)) {
- return googleredesignedDomi.getParentPositionalSelector(node) + node.nodeName + ":last-child";
- }
- var selectorWithinSiblings = "";
- for (var i = 0; i < node.parentNode.childNodes.length; i++) {
- var currentNode = node.parentNode.childNodes[i];
- if (!(currentNode instanceof Element)) {
- continue;
- }
- if (currentNode == node) {
- selectorWithinSiblings += node.nodeName;
- break;
- }
- if (googleredesignedDomi.isCSSFirstChild(currentNode)) {
- selectorWithinSiblings += currentNode.nodeName + ":first-child + ";
- } else {
- selectorWithinSiblings += currentNode.nodeName + " + ";
- }
- }
- return googleredesignedDomi.getParentPositionalSelector(node) + selectorWithinSiblings;
- },
- isCSSFirstChild:function (node) {
- for (var i = 0; i < node.parentNode.childNodes.length; i++) {
- var currentNode = node.parentNode.childNodes[i];
- if (currentNode instanceof Element) {
- return currentNode == node;
- }
- }
- return false;
- },
- isCSSLastChild:function (node) {
- for (var i = node.parentNode.childNodes.length - 1; i >= 0; i--) {
- var currentNode = node.parentNode.childNodes[i];
- if (currentNode instanceof Element) {
- return currentNode == node;
- }
- }
- return false;
- }
- }
-